// 피자 가게
public class AmericanPizzaStore extends PizzaStore{
public Pizza getPizza(String pizzaName){
if(pizzaName == "AmericaPizza")
return new AmericaPizza();
//else if(pizzaName == "~~")
}
}
public class SeoulPizzaStore extends PizzaStore{
public Pizza getPizza(String pizzaName){
if(pizzaName == "SeoulPizza")
return new SeoulPizza();
//else if(pizzaName == "~~")
}
}
// 피자 클래스
public class Pizza{
private Dough dough;
private Source source;
public Pizza(){
this.dough = pizzaFactory.getDough();
this.source = pizzaFactory.getSource();
}
}
// 피자 클래스 (구체)
public class AmericaPizza extends Pizza{
public AmericaPizza() {
super();
}
}
public class SeoulPizza extends Pizza{
public SeoulPizza() {
super();
}
}
위의 예제에선 하나의 종류 피자만 생성하지만 확장하면 다이어그램처럼 다양한 피자를 만들 수 있습니다.
여기서 드는 궁금증! 추상 팩토리와 팩토리 메소드의 공통점, 차이점은?
둘의 다이어그램을 같이 보며 비교해보겠습니다.
추상 팩토리
팩토리 메소드
공통점
Template Method Pattern을 사용합니다.
어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
Factory Method Pattern을 사용합니다.
Factory를 통해실제 구현 대상인 Concrete와 Client 간 결합도를 낮춰줍니다.
인자에 따라 생성되는 객체가 결정됩니다.
객체 생성을 캡슐화 합니다.
의존성 주입(DI, Dependency Injection): 객체 생성을 캡슐화 하고 외부로 부터 필요한 객체를 받아 사용하므로써 결합도가 낮아지고 유연한 코드가 생성될 수 있습니다.
차이점
Factory 클래스에서 객체에 대한 생성을 지원하는 범위가 다릅니다.
추상 팩토리: 한 Factory에서 서로 연관된 여러 종류의 객체 생성을 지원합니다. (제품군 생성 지원)
팩토리 메소드: 한 Factory당 한 종류의 객체 생성 지원합니다.
인자에 따라 선택되는 것이 다릅니다.
추상 팩토리: 인자에 따라 객체들을 생성하는 Factory의 종류가 결정됩니다. (다수의 Factory 존재)
팩토리 메소드: 인자에 따라 생성되는 객체의 종류가 결정됩니다.
포커스
추상 팩토리: 클래스(Factory) 레벨에서 포커스를 맞춤으로써, Product들이 다른 클래스와 사용될 때의 제약사항을 강제할 수 있습니다. 새로운 ConcreteFactory를 추가할 때 많은 작업이 필요합니다.
팩토리 메소드: 메소드 레벨에서 포커스를 맞춤으로써, Client의 ConcreteProduct 인스턴스의 생성 및 구성에 대한 책임을 덜어줍니다.